// 题目描述
// 讨论 (155)
// 46. 全排列
// 中等
// 61
// 给定一个不含重复数字的整数数组 nums ，返回其 所有可能的全排列 。可以 按任意顺序 返回答案。
//   示例 1：
// 输入：nums = [1,2,3]
// 输出：[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
// 示例 2：
// 输入：nums = [0,1]
// 输出：[[0,1],[1,0]]
// 示例 3：
// 输入：nums = [1]
// 输出：[[1]]
//   提示：
// 1 <= nums.length <= 6
// -10 <= nums[i] <= 10
// nums 中的所有整数 互不相同
//   注意：本题与主站 46 题相同：https://leetcode-cn.com/problems/permutations/
// 通过次数
// 29.8K
// 提交次数
// 34.7K
// 通过率
// 85.8%
// https://leetcode.cn/problems/VvJkup/

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function (nums) {
  const res = []
  helper(nums, [], new Set(), res)

  return res
}

const helper = (nums, cur, set, res) => {
  if (cur.length === nums.length) {
    res.push(cur.slice())
    return
  }

  for (let i = 0, len = nums.length; i < len; i++) {
    const o = nums[i]

    if (set.has(o)) {
      continue
    }

    cur.push(o)
    set.add(o)
    helper(nums, cur, set, res)
    cur.pop()
    set.delete(o)
  }
}

console.log(permute([1, 2, 3]))
// [
//   [ 1, 2, 3 ],
//   [ 1, 3, 2 ],
//   [ 2, 1, 3 ],
//   [ 2, 3, 1 ],
//   [ 3, 1, 2 ],
//   [ 3, 2, 1 ]
// ]
